home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / editors / memcs312 / ue312pl1.zoo / st52.c < prev    next >
C/C++ Source or Header  |  1993-12-02  |  23KB  |  958 lines

  1. /*    ST52.C:    Atari ST1040/520 screen support functions
  2.         written by lots of people (see below)
  3.  
  4.         Daniel Lawrence
  5.         James Turner
  6.         Jeff Lomicka
  7.         J. C. Benoist
  8.  
  9.     Modification History:
  10.     31-dec-87    Jeff Lomicka
  11.     - massive changes/additions for accessories and mouse
  12.     20-jan-87    Daniel Lawrence
  13.     - changed code in domousekey() to pass five bytes, two zeros
  14.       (to tell input.c that this is a mouse event), x/ypos
  15.       and the mouse event type.
  16.     may 88        Jeff Lomicka and Dan Lawrence
  17.     - a lot of changes.  Through out aline.h, use the MWC and
  18.       ATARI names for things now.
  19.     - moving the mouse to the extreme upper left brings up
  20.       the desk accessory menu.  EMACS won't replot on the
  21.       way out yet.
  22.     - cleaned up behavior of the mouse and the cursor on exit
  23.     26-feb-89    Daniel Lawrence
  24.     - rewote input layer to conform to new specs in input.c
  25.     01-may-91    Daniel Lawrence/Suggested by Allan Pratt
  26.     - renamed atari source files to TOS.C and ST52.c
  27.     - changed symbols ATARI => ST52 and ST520 => TOS
  28. */
  29.  
  30. #define termdef 1        /* don't define "term" external */
  31.  
  32. #include    <stdio.h>
  33. #include    "estruct.h"
  34. #include    "eproto.h"
  35. #include    "edef.h"
  36. #include    "elang.h"
  37.  
  38. #if    ST52
  39.  
  40. /*
  41.     These routines provide support for the ATARI 1040ST and 520ST
  42. using the virtual VT52 Emulator
  43.  
  44. */
  45.  
  46. #include    <aesbind.h>
  47. #include    <gemdefs.h>
  48. #include    <obdefs.h>
  49. #include    <osbind.h>
  50. #include    <bios.h>
  51. #include    <xbios.h>
  52. #include    <linea.h>
  53.  
  54. #define NROW    50    /* Screen size.         */
  55. #define NCOL    80    /* Edit if you want to.     */
  56. #define MARGIN    8    /* size of minimim margin and    */
  57. #define SCRSIZ    64    /* scroll size for extended lines */
  58. #define NPAUSE    300    /* # times thru update to pause */
  59. #define BIAS    0x20    /* Origin 0 coordinate bias.    */
  60. #define ESC    0x1B    /* ESC character.        */
  61. #define SCRFONT 2    /* index of 8x16 monochrome system default font */
  62. #define DENSIZE 50    /* # of lines in a dense screen */
  63.  
  64. /*    Palette color definitions    */
  65.  
  66. #define LOWPAL    "000700070770007707077777333733373773337737377777"
  67. #define MEDPAL    "000700007777"
  68. #define HIGHPAL "111000"
  69.  
  70. /*    ST Global definitions        */
  71.  
  72. int initrez;            /* initial screen resolution */
  73. int currez;            /* current screen resolution */
  74. int gemflag;            /* were we called from the desktop? */
  75. int mouseon;            /* True if mouse is on */
  76. char resname[][8] = {        /* screen resolution names */
  77.     "LOW", "MEDIUM", "HIGH", "DENSE"
  78. };
  79. short spalette[16];        /* original color palette settings */
  80. short palette[16];        /* current palette settings */
  81. static short scursor;        /* original text cursor mode */
  82.  
  83. struct la_data *aline;        /* Line A data structure */
  84.  
  85. struct la_ext *naline;        /* extended Line A data structure */
  86.  
  87. struct la_font **fonts;    /* Array of pointers to the three system
  88.               font headers returned by init (in register A1) */
  89.  
  90. struct la_font *system_font;    /* pointer to default system font */
  91. struct la_font *small_font;    /* pointer to small font */
  92.  
  93. /*
  94.     These are needed to make GEM happy
  95. */
  96. int contrl[ 11], intin[ 128], intout[ 128], ptsin[ 256], ptsout[ 12];
  97. static int worki[ 11] = {1,1,1,1,1,1,1,1,1,1,2}, worko[ 57];
  98.  
  99. /*
  100.     Some useful information about our environment
  101. */
  102. static int
  103.     g_wchar, g_hchar,    /* VDI's idea of current font size */
  104.     junk, gid, wkid;    /* Graphics ID, workstation ID */
  105.  
  106. static int    w_handle;    /* our window's handle */
  107. static Rect    w_area;        /* our window's area */
  108.  
  109. static int oldbut = 0;        /* Previous state of mouse buttons */
  110. static int mctrl;        /* current BEG_MOUSE state */
  111. static struct { char *norm, *shift, *caps;} *kt;    /* Keyboard mapping */
  112.  
  113. /*
  114.     This object tree is for displaying the desk accessory menu.
  115.     Actual positions are written into this structure when the
  116.     screen size is known.
  117. */
  118. OBJECT menu[] =
  119.     {
  120.     -1, 1, 4,    G_IBOX,   NONE,  NORMAL, 0x0L,        0 , 0,   0,   0,/* Root */
  121.      4, 2, 2,     G_BOX,   NONE,  NORMAL, 0x10F0L,   0,    0,   1,   1,/* BAR */
  122.      1, 3, 3,    G_IBOX,   NONE,  NORMAL, 0x0L,        0,    0,   1,   1,/* Active */
  123.      2,-1,-1,  G_TITLE,   NONE,  NORMAL,  "",        0,    0,   1,   1,/* title */
  124.      0, 5, 5,    G_IBOX,   NONE,  NORMAL, 0x0L,        0,    0,   0,   0,/* screen */
  125.      4, 6,13,     G_BOX,   NONE,  NORMAL, 0xFF1100L, 0,    0,   0,   0,/* box */
  126.      7,-1,-1, G_STRING,   NONE,  NORMAL, TEXT179,0,0,168,    16,
  127. /*                                       "  About MicroEmacs" */
  128.      8,-1,-1, G_STRING,   NONE,DISABLED, "---------------------",
  129.                             0, 16, 168,  16,
  130.      9,-1,-1, G_STRING,   NONE,  NORMAL, "",        0, 32, 168,  16,
  131.     10,-1,-1, G_STRING,   NONE,  NORMAL, "",        0, 48, 168,  16,
  132.     11,-1,-1, G_STRING,   NONE,  NORMAL, "",        0, 64, 168,  16,
  133.     12,-1,-1, G_STRING,   NONE,  NORMAL, "",        0, 80, 168,  16,
  134.     13,-1,-1, G_STRING,   NONE,  NORMAL, "",        0, 96, 168,  16,
  135.      5,-1,-1, G_STRING, LASTOB,  NORMAL, "",        0,112, 168,  16
  136.     };
  137.  
  138. static int mousecol = HUGE;    /* current mouse column */
  139. static int mouserow = HUGE;    /* current mouse row */
  140.  
  141. extern    int    ttopen();        /* Forward references.        */
  142. extern    int    ttgetc();
  143. extern    int    ttputc();
  144. extern    int    ttflush();
  145. extern    int    ttclose();
  146. extern    int    stmove();
  147. extern    int    steeol();
  148. extern    int    steeop();
  149. extern    int    stbeep();
  150. extern    int    stopen();
  151. extern    int    stclose();
  152. extern    int    stgetc();
  153. extern    int    stputc();
  154. extern    int    strev();
  155. extern    int    strez();
  156. extern    int    stkopen();
  157. extern    int    stkclose();
  158.  
  159. #if    COLOR
  160. extern    int    stfcol();
  161. extern    int    stbcol();
  162. #endif
  163.  
  164. /*
  165.  * Dispatch table. All the
  166.  * hard fields just point into the
  167.  * terminal I/O code.
  168.  */
  169. TERM    term    = {
  170.     NROW-1,
  171.     NROW-1,
  172.     NCOL,
  173.     NCOL,
  174.     0, 0,
  175.     MARGIN,
  176.     SCRSIZ,
  177.     NPAUSE,
  178.     &stopen,
  179.     &stclose,
  180.     &stkopen,
  181.     &stkclose,
  182.     &stgetc,
  183.     &stputc,
  184.     &ttflush,
  185.     &stmove,
  186.     &steeol,
  187.     &steeop,
  188.     &steeop,
  189.     &stbeep,
  190.     &strev,
  191.     &strez
  192. #if    COLOR
  193.     , &stfcol,
  194.     &stbcol
  195. #endif
  196. };
  197.  
  198. /*    input buffers and pointers    */
  199.  
  200. #define    IBUFSIZE    64    /* this must be a power of 2 */
  201.  
  202. unsigned char in_buf[IBUFSIZE];    /* input character buffer */
  203. int in_next = 0;        /* pos to retrieve next input character */
  204. int in_last = 0;        /* pos to place most recent input character */
  205.  
  206. in_init()    /* initialize the input buffer */
  207.  
  208. {
  209.     in_next = in_last = 0;
  210. }
  211.  
  212. in_check()    /* is the input buffer non-empty? */
  213.  
  214. {
  215.     if (in_next == in_last)
  216.         return(FALSE);
  217.     else
  218.         return(TRUE);
  219. }
  220.  
  221. in_put(event)
  222.  
  223. int event;    /* event to enter into the input buffer */
  224.  
  225. {
  226.     in_buf[in_last++] = event;
  227.     in_last &= (IBUFSIZE - 1);
  228. }
  229.  
  230. int in_get()    /* get an event from the input buffer */
  231.  
  232. {
  233.     register int event;    /* event to return */
  234.  
  235.     event = in_buf[in_next++];
  236.     in_next &= (IBUFSIZE - 1);
  237.     return(event);
  238. }
  239.  
  240. void init_aline()
  241.  
  242. {
  243.     int *ld_contrl;
  244.     int *ld_intin;
  245.  
  246.     linea0();
  247.  
  248.     /* save if the current mouse is hidden (ie we are not in GEM) */
  249.     gemflag = (mousehidden == 0);
  250.     while (mousehidden) {
  251.         showmouse();
  252.         }
  253.     aline = (struct la_data *)(la_init.li_a0);
  254.     fonts = (struct la_font **)(la_init.li_a1);
  255.     naline = ((struct la_ext *)aline) - 1;
  256.     scursor = naline->ld_status;        /* State of text cursor */
  257.     ld_contrl = aline->ld_contrl;        /* -> control junk    */
  258.     ld_intin  = aline->ld_intin;        /* -> intin junk    */
  259. }
  260.  
  261. init()
  262.  
  263. {
  264.     init_aline();
  265.     system_font = fonts[SCRFONT];        /* save it */
  266.     small_font = fonts[1];
  267. }
  268.  
  269.  
  270. switch_font(fp)
  271.  
  272. struct la_font *fp;
  273.  
  274. {
  275.        /* See linea.h for description of fields */
  276.  
  277.        V_CEL_HT = fp->font_height;
  278.        V_CEL_WR = aline->ld_vwrap * fp->font_height;
  279.        V_CEL_MY = (naline->ld_y_max / fp->font_height) - 1;
  280.        V_CEL_MX = (naline->ld_x_max / fp->font_fat_cell) - 1;
  281.        V_FNT_WR = fp->font_width;
  282.        V_FNT_ST = fp->font_low_ade;
  283.        V_FNT_ND = fp->font_hi_ade;
  284.        V_OFF_AD = (long) fp->font_char_off;
  285.        V_FNT_AD = (long) fp->font_data;
  286. }
  287.  
  288. stmove(row, col)
  289.  
  290. {
  291.     stputc(ESC);
  292.     stputc('Y');
  293.     stputc(row+BIAS);
  294.     stputc(col+BIAS);
  295. }
  296.  
  297. steeol()
  298.  
  299. {
  300.     stputc(ESC);
  301.     stputc('K');
  302. }
  303.  
  304. steeop()
  305.  
  306. {
  307. #if    COLOR
  308.     stfcol(gfcolor);
  309.     stbcol(gbcolor);
  310. #endif
  311.     stputc(ESC);
  312.     stputc('J');
  313. }
  314.  
  315. strev(status)    /* set the reverse video state */
  316.  
  317. int status;    /* TRUE = reverse video, FALSE = normal video */
  318.  
  319. {
  320.     if (currez > 1) {
  321.         stputc(ESC);
  322.         stputc(status ? 'p' : 'q');
  323.     }
  324. }
  325.  
  326. #if    COLOR
  327. mapcol(clr)    /* medium rez color translation */
  328.  
  329. int clr;    /* emacs color number to translate */
  330.  
  331. {
  332.     static int mctable[] = {0, 1, 2, 3, 2, 1, 2, 3};
  333.  
  334.     if (currez != 1)
  335.         return(clr);
  336.     else
  337.         return(mctable[clr]);
  338. }
  339.  
  340. stfcol(color)    /* set the forground color */
  341.  
  342. int color;    /* c